package lxbAdmin.userSystem.server.impl;

import com.alibaba.fastjson.JSON;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import io.netty.util.internal.StringUtil;
import lxbAdmin.userSystem.common.constants.SystemUserConstant;
import lxbAdmin.userSystem.dao.PermissionMapper;
import lxbAdmin.userSystem.dto.RolePermissionDTO;
import lxbAdmin.userSystem.dto.RolePermissionTableDTO;
import lxbAdmin.userSystem.dto.SystemMenuDTO;
import lxbAdmin.userSystem.dto.SystemPermissionDTO;
import lxbAdmin.userSystem.entity.SystemMenu;
import lxbAdmin.userSystem.entity.SystemParentMenu;
import lxbAdmin.userSystem.server.SystemPermissionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.TimeUnit;

@Service
public class SystemPermissionServiceImpl implements SystemPermissionService {

    @Autowired
    private PermissionMapper permissionMapper;
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public SystemMenuDTO detail(String roleId) {
        SystemMenuDTO value = JSON.parseObject((String)redisTemplate.opsForValue().get(roleId),SystemMenuDTO.class);
        if(value != null)
            return value;
        //查询该角色下的菜单以及按钮控制权限
        List<SystemMenu> systemMenu = permissionMapper.selectMenuByRoleId(roleId);
        //查询该角色下的父级菜单
        List<SystemParentMenu> parentMenuList = permissionMapper.selectParentMenuList(roleId);
        //将角色对应权限放到redis中,设置两小时超时
        redisTemplate.opsForValue().set(roleId,
                JSON.toJSONString(SystemMenuDTO.builder().systemMenu(systemMenu).systemParentMenuList(parentMenuList).build()),
                2,
                TimeUnit.HOURS);
        return SystemMenuDTO.builder().systemMenu(systemMenu).systemParentMenuList(parentMenuList).build();
    }

    @Override
    public void edit(SystemPermissionDTO systemPermissionDTO) {
        List<SystemMenu> list = systemPermissionDTO.getSystemMenu();
        //删除该角色下绑定的所有菜单权限
        permissionMapper.delMenuByRoleId(systemPermissionDTO.getRoleId());
        //删除该角色下绑定在菜单中的按钮控制
        permissionMapper.delMenuAction(systemPermissionDTO.getRoleId());
        //重新绑定该角色下的菜单权限
        list.forEach(e -> {
            permissionMapper.addMenuByRoleId(e.getMenuId(),systemPermissionDTO.getRoleId());
            permissionMapper.addMenuAction(e.getMenuId()
                                            ,systemPermissionDTO.getRoleId()
                                            ,e.getSystemMenuAction().getPermissionControl());
        });
        //查询该角色下的菜单以及按钮控制权限
        List<SystemMenu> systemMenu = permissionMapper.selectMenuByRoleId(systemPermissionDTO.getRoleId());
        //查询该角色下的父级菜单
        List<SystemParentMenu> parentMenuList = permissionMapper.selectParentMenuList(systemPermissionDTO.getRoleId());
        redisTemplate.opsForValue().set(systemPermissionDTO.getRoleId(),
                JSON.toJSONString(SystemMenuDTO.builder().systemMenu(systemMenu).systemParentMenuList(parentMenuList).build()),
                2,
                TimeUnit.HOURS);
    }

    @Override
    public RolePermissionTableDTO getAll(RolePermissionDTO rolePermissionDTO) {
        if (StringUtil.isNullOrEmpty(rolePermissionDTO.getSort())) {
            rolePermissionDTO.setSort(SystemUserConstant.ROLE_ID);
        }
        if (StringUtil.isNullOrEmpty(rolePermissionDTO.getSortType())) {
            rolePermissionDTO.setSortType(SystemUserConstant.SORT_TYPE);
        }
        RolePermissionTableDTO result = new RolePermissionTableDTO();
        result.setPageNo(rolePermissionDTO.getPageNo());
        result.setPageNum(rolePermissionDTO.getPageNum());
        PageHelper.startPage(rolePermissionDTO.getPageNo(), rolePermissionDTO.getPageNum());
        List<RolePermissionDTO> list = permissionMapper.getAll(rolePermissionDTO);
        result.setTotal(((Page<?>) list).getTotal());
        result.setTableData(list);
        return result;
    }
}






















